package com.lss.b_doublePointer;

/**
 * @author lss
 * @description 移动零
 * @createDate 2024/11/27-22:36
 */
public class lc_283 {
    public static void main(String[] args) {

    }

    /**
     * 给定一个数组 nums，编写一个函数将所有 0 移动到数组的末尾，
     * 同时保持非零元素的相对顺序。
     *
     * @param nums 数组
     */
    public void moveZeroes(int[] nums) {
        if (nums.length == 1) {
            return;
        }
        int slow = 0;
        for (int i = slow; i < nums.length; i++) {
            if (nums[i] != 0) {
                nums[slow++] = nums[i];
                // 注意边界条件
                if (i >= slow){
                    nums[i] = 0;
                }
            }
        }
    }

    /**
     * 灵神解法
     * @param nums
     */
    public void moveZeroes0(int[] nums) {
        int i0 = 0;
        for (int i = 0; i < nums.length; i++) {
            // todo 很好的处理了0值问题 代码相对来说更加优雅
            if (nums[i] != 0) {
                // 交换 nums[i] 和 nums[i0]
                int tmp = nums[i];
                nums[i] = nums[i0];
                nums[i0] = tmp;
                i0++;
            }
        }
    }

}
